package com.jdy.hotel.check;

import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.TextView;

import com.jdy.hotel.check.Check.IError;
import com.jdy.hotel.check.Check.CheckItemView;
import com.jdy.hotel.check.CheckHelper.CheckEnum;
import com.jdy.hotel.check.CheckHelper.Checkable;

import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.List;

/**
 * 检查项目
 */
public class CheckItem implements IError, CheckItemView, Checkable {
    /**
     * 字段名称，作为网络数据请求的参数名称
     */
    private String fieldName;

    /**
     * 提示名称，当字段校验失败时，给出的提示字段名称
     */
    private String promptName;

    /**
     * 对应的字段View控件
     */
    private View mView;

    /**
     * 提示的错误信息
     */
    private String errorMessage;

    /**
     * 每个字段可以有种校验，只有当每一个校验都通过时，整个Item的校验才算成功！
     */
    private List<Check> checks = new ArrayList<>();

    CheckItem(String fieldName, String promptName, View mView) {
        this.fieldName = fieldName;
        this.promptName = promptName;
        this.mView = mView;
    }

    /**
     * 获取View控件
     *
     * @return View控件
     */
    @Override
    public View getView() {
        return mView;
    }

    /**
     * 获取字段名称
     *
     * @return 字段名称
     */
    public String getFieldName() {
        return fieldName;
    }

    public String getPromptName() {
        return promptName;
    }

    /**
     * 获取View控件上的内容
     *
     * @return 控件上的内容
     */
    @Override
    public String getValue() {
        //如果控件是RadioButton，取值1或者0
        if (mView instanceof RadioButton)
            return ((RadioButton) mView).isChecked() ? "1" : "0";

        //控件是EditText或者TextView直接获取其内容
        if (mView instanceof EditText || mView instanceof TextView)
            return ((TextView) mView).getText().toString();

        return null;
    }

    /**
     * 读取错误信息
     *
     * @return 错误信息
     */
    @Override
    public String getMessage() {
        //xx字段 xx错误
        return promptName + errorMessage;
    }

    @NotNull
    @Override
    public String toString() {
        return "CheckItem{" +
                "fieldName='" + fieldName + '\'' +
                ", promptName='" + promptName + '\'' +
                ", mView=" + mView +
                ", errorMessage='" + errorMessage + '\'' +
                ", checks=" + checks +
                '}';
    }

    /**
     * 添加检查类型
     *
     * @param checkEnum 检查类型
     */
    @Override
    public void addCheck(CheckEnum checkEnum) {
        addCheck(checkEnum.getCheck());
    }

    public void addCheck(Check check){
        checks.add(check);
    }

    /**
     * 检查执行代码
     *
     * @return 检查结果
     */
    @Override
    public boolean check() {
        String value = getValue();//获取当前检查项的值
        for (Check check : checks) {//对值进行所有有必要的检查
            if (TextUtils.isEmpty(errorMessage = check.checkResult(value))) {//如果没有返回错误信息，证明检查通过
                continue;
            }
            //否则，检查不通过
            return false;
        }
        return true;
    }

    public List<Check> getChecks() {
        return checks;
    }
}
